package niuKe;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * @ClassName V018_识别有效的IP地址和掩码并进行分类统计
 * @Description TODO
 * @Author dzf
 * @Date 2022/11/11 14:38
 * @Version 1.0
 */
public class V018_识别有效的IP地址和掩码并进行分类统计 {
    /**
     * 描述
     * 请解析IP地址和对应的掩码，进行分类识别。要求按照A/B/C/D/E类地址归类，不合法的地址和掩码单独归类。
     * 
     * 所有的IP地址划分为 A,B,C,D,E五类
     * 
     * A类地址从1.0.0.0到126.255.255.255;
     * 
     * B类地址从128.0.0.0到191.255.255.255;
     * 
     * C类地址从192.0.0.0到223.255.255.255;
     * 
     * D类地址从224.0.0.0到239.255.255.255；
     * 
     * E类地址从240.0.0.0到255.255.255.255
     * 
     * 
     * 私网IP范围是：
     * 
     * 从10.0.0.0到10.255.255.255
     * 
     * 从172.16.0.0到172.31.255.255
     * 
     * 从192.168.0.0到192.168.255.255
     * 
     * 
     * 子网掩码为二进制下前面是连续的1，然后全是0。（例如：255.255.255.32就是一个非法的掩码）
     * （注意二进制下全是1或者全是0均为非法子网掩码）
     * 
     * 注意：
     * 1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类，也不属于不合法ip地址，计数时请忽略
     * 2. 私有IP地址和A,B,C,D,E类地址是不冲突的
     * 
     * 输入描述：
     * 多行字符串。每行一个IP地址和掩码，用~隔开。
     * 
     * 请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
     * 输出描述：
     * 统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数，之间以空格隔开。
     * 
     * 示例1
     * 
     * 输入：10.70.44.68~255.254.255.0
     * 1.0.0.1~255.0.0.0
     * 192.168.0.2~255.255.255.0
     * 19..0.~255.255.255.0
     * 
     * 输出：1 0 1 0 0 2 1
     * 
     * 说明：
     * 10.70.44.68~255.254.255.0的子网掩码非法，19..0.~255.255.255.0的IP地址非法，所以错误IP地址或错误掩码的计数为2；
     * 1.0.0.1~255.0.0.0是无误的A类地址；
     * 192.168.0.2~255.255.255.0是无误的C类地址且是私有IP；
     * 所以最终的结果为1 0 1 0 0 2 1
     * A B C D E 错误 私有
     * 
     * 
     * 示例2
     * 
     * 输入： 0.201.56.50~255.255.111.255
     * 127.201.56.50~255.255.111.255
     * 
     * 输出：
     * 0 0 0 0 0 0 0
     * 说明：
     * 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类，也不属于不合法ip地址，计数时请忽略
     **/

    public static void main(String[] args) throws IOException {
//        Scanner in = new Scanner(System.in);
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String str;
        int a = 0, b = 0, c = 0, d = 0, e = 0, err = 0, pri = 0;
        while ((str=buffer.readLine())!=null) {
            if (!str.contains("~")) {
                break;
            }
            String[] split = str.split("~");
            if (null != split[0] && null != split[1]) {
                String[] split1 = split[0].split("\\.");
                String[] split2 = split[1].split("\\.");
                if (split1.length == 4 && split2.length == 4) {
                    Integer ip1 = Integer.valueOf(split1[0]);
                    Integer ip2 = Integer.valueOf(split1[1]);
                    Integer ip3 = Integer.valueOf(split1[2]);
                    Integer ip4 = Integer.valueOf(split1[3]);
                    if (0 != ip1 && 127 != ip1) {

                        if (255 == Integer.valueOf(split2[0]) && (0 == Integer.valueOf(split2[1]) || 255 == Integer.valueOf(split2[1])) &&
                                (0 == Integer.valueOf(split2[2]) || 255 == Integer.valueOf(split2[2])) && 0 == Integer.valueOf(split2[3])) {
                            if (1 <= ip1 && 0 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                    126 >= ip1 && 255 >= ip2 && 255 >= ip3 && 255 >= ip4) {
                                a++;
                            } else if (128 <= ip1 && 0 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                    191 >= ip1 && 255 >= ip2 && 255 >= ip3 && 255 >= ip4) {
                                b++;
                            } else if (192 <= ip1 && 0 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                    223 >= ip1 && 255 >= ip2 && 255 >= ip3 && 255 >= ip4) {
                                c++;
                            } else if (224 <= ip1 && 0 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                    239 >= ip1 && 255 >= ip2 && 255 >= ip3 && 255 >= ip4) {
                                d++;
                            } else if (240 <= ip1 && 0 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                    255 >= ip1 && 255 >= ip2 && 255 >= ip3 && 255 >= ip4) {
                                e++;
                            } else {
                                err++;
                            }
                            if ((10 <= ip1 && 0 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                    10 >= ip1 && 255 >= ip2 && 255 >= ip3 && 255 >= ip4) ||
                                    (172 <= ip1 && 16 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                            172 >= ip1 && 31 >= ip2 && 255 >= ip3 && 255 >= ip4) ||
                                    (192 <= ip1 && 168 <= ip2 && 0 <= ip3 && 0 <= ip4 &&
                                            192 >= ip1 && 168 >= ip2 && 255 >= ip3 && 255 >= ip4) ) {
                                pri++;
                            }
                        } else {
                            err++;
                        }
                    }

                } else if (0 != Integer.valueOf(split1[0]) && 127 != Integer.valueOf(split1[0])){
                    err++;
                }
            }


        }
        System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+err+" "+pri);
    }

//    public static void main(String[] args) throws IOException {
//        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
//        String str;
//        int a=0,b=0,c=0,d=0,e=0,err=0,pri=0;
//        while((str=buffer.readLine())!=null){
//            int index=str.indexOf('~');
//            long num1=strToInt(str.substring(0,index));
//            long num2=strToInt(str.substring(index+1));
//            long t=num1>>24;
//            if(t==0||t==127) continue;
//            if(num2<=0||num2>=0XFFFFFFFFL||(((num2 ^ 0XFFFFFFFFL)+1)|num2)!=num2){
//                err++;
//                continue;
//            }
//            if(t<=0)err++;
//            else if(t>=1&&t<=126){
//                a++;
//                if(t==10) pri++;
//            }else if(t>=128&&t<=191){
//                b++;
//                if(num1>>20==0xAC1)pri++;
//            }else if(t>=192&&t<=223){
//                c++;
//                if(num1>>16==0xC0A8)pri++;
//            }else if(t>=224&&t<=239)d++;
//            else if(t>=240&&t<=255)e++;
//        }
//        System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+err+" "+pri);
//    }
//    public static long strToInt(String str){
//        char[] cs=str.toCharArray();
//        long res=0,tmp=0,flag=0;
//        for(char c:cs){
//            if(c=='.'){
//                res=res<<8|tmp;
//                tmp=0;
//                flag++;
//            }
//            else if(c>='0'&&c<='9'){
//                tmp=tmp*10+c-'0';
//                flag=0;
//            }else{
//                return -1;
//            }
//            if(flag>=2) return -1;
//
//        }
//        res=res<<8|tmp;
//        return res;
//    }
}
